package com.bw.aop;

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Component // 把对象放入容器
//@Aspect // 声明一个通知类
public class Myaop {

   // public Integer com.bw.service.BookServiceImpl.updateBook(com.bw.entity.Book)
    /**
     * 切入点表达式: 用来切方法  切开之后 把代码放进去
     * 前置通知     在原方法执行之前 执行
     * @param joinPoint
     */
    @Before("execution(* com.bw.service.*.*(..))")
    public void b(JoinPoint joinPoint){

        String name = joinPoint.getSignature().getName(); // 方法的名字
        System.out.println("aop中获取到的方法名" + name);

        Object[] args = joinPoint.getArgs(); // 方法的入参
        System.out.println("aop中获取的方法入参 " + JSON.toJSONString(args));


    }


    //后置增强，方法正常退出时执行
    @AfterReturning(value = "execution( * com.bw.service.*.*(..)  )",returning = "a")
    public void afterRunning(Object a) {
        System.out.println("方法的返回值是 " + JSON.toJSONString(a));
        System.out.println("----@AfterReturning 方法正常退出时执行------");
    }

    //异常抛出增强
    @AfterThrowing("execution( * com.bw.service.*.*(..)  )")
    public void afterThrow() {
        System.out.println("----@AfterThrowing 异常时执行------");
    }

    //final增强，不管是抛出异常或者正常退出都会执行
    @After("execution( * com.bw.service.*.*(..)  )")
    public void afterFinal() {
        System.out.println("----@After 最后一定会执行------");
    }

}
